const {
	menusModel,
	model,
	Op
} = require('../model/menus.js');

function format(data, parent_id = 0, obj = []) { // 递归生成“树”
	for (var i = 0; i < data.length; i++) {
		data[i].children = data[i].children || []
			if (data[i].parent_id == parent_id) {
				data[i].flag = false
					var index = obj.push(data[i])
					format(data, data[i].id, obj[index - 1].children) // 递归
			}
	}
	return obj
}

class Menus {
	//查询
	async list(req, res) {
		const {
			status
		} = req.query
			const where = status ? {
			status
		}
		 : {}
		const ret = await menusModel.findAll({
				where,
				attributes: ['id', 'icon', 'menu_name', 'parent_id', 'router', 'status', 'sort'],
				raw: true,
				order: [['sort', 'desc']]
			}).catch(() => {
				res.status(404)
				res.send({
					error: '数据查询失败',
					data: null
				})
			})
			res.send({
				error: null,
				data: format(ret)
			});

	}
	//通过ID获取数据
	async one(req, res) {
		const id = req.params.id;
		const ret = await menusModel.findOne({
				attributes: ['id', 'icon', 'menu_name', 'parent_id', 'router', 'status'],
				raw: true,
				where: {
					id
				}
			}).catch(() => {
				res.status(404)
				res.send({
					error: '数据查询失败',
					data: null
				})
				return
			})
			res.send({
				error: null,
				data: ret
			});
	}

	//添加
	async add(req, res) {
		req.body.sort = new Date();
		const ret = await menusModel.create(req.body).catch((ret) => {
				res.status(404);
				res.send({
					error: ret.errors[0],
					data: null
				})
			});
		res.send({
			error: null,
			data: ret
		});
	}
	//编辑
	edit(req, res) {
		const id = req.params.id;
		menusModel.update(req.body, {
			where: {
				id,
			},
			attributes: ['menu_name', 'icon', 'status', 'router']
		}).then((ret) => {
			res.status(200);
			res.send({
				error: null,
				data: ret
			});
		}).catch((ret) => {
			res.status(404);
			res.send({
				error: ret.errors[0].message,
				data: null
			});
		});
	}

	//排序
	async sort(req, res) {
		const {
			id,
			dir
		} = req.params;
		if (!id) {
			res.status(404);
			res.send({
				error: 'ID参数错误',
				data: null
			});
			return
		}
		const {
			parent_id,
			sort
		} = await menusModel.findOne({
				where: {
					id
				},
				raw: true
			});

		let ret;
		switch (dir) {
		case 'up': //向上排序
			ret = await menusModel.findOne({
					where: {
						parent_id,
						sort: {
							[Op.gt]: sort
						}
					},
					order: [['ctime', 'asc']]
				});
			break
		case 'down': //向下排序
			ret = await menusModel.findOne({
					where: {
						parent_id,
						sort: {
							[Op.lt]: sort
						}
					},
					order: [['ctime', 'desc']]
				})
				break;
		default:
			res.status(404);
			res.send({
				error: 'dir参数错误',
				data: null
			});
			return
		}
		if (ret) { //交换
			await menusModel.update({
				sort,
			}, {
				where: {
					id: ret.id
				}
			})
			await menusModel.update({
				sort: ret.sort
			}, {
				where: {
					id
				}
			})
		}
		res.send({
			error: null,
			data: '排序成功'
		});
	}
	//删除
	async del(req, res) {
		const id = req.params.id;
		const ret = await menusModel.findOne({
				where: {
					parent_id: id
				},
				raw: true
			});
		if (ret) {
			res.status(404)
			res.send({
				error: '请先删除子级',
				data: null
			})
			return
		}
		menusModel.destroy({
			where: {
				id,
			}
		}).then((ret) => {
			if (ret) {
				res.send({
					error: null,
					data: '删除成功'
				});
			} else {
				res.send({
					error: '记录不存在',
					data: null
				});
			}
		}).catch(() => {
			res.status(404)
			res.send({
				error: '删除失败',
				data: null
			})
		})
	}

	/*
	判断某个字段的值是否存在
	 */
	async exists(req, res) {
		const {
			field,
			value
		} = req.params;
		let where = {}
		where[field] = value;
		const ret = await menusModel.findOne({
				where,
			});
		if (ret) {
			res.send(true);
		} else {
			res.send(false)
		}
	}
}

module.exports = new Menus();
